package br.com.jk.financeiro.movimento;

import br.com.jk.cliente.Cliente;
import br.com.jk.cliente.ClienteRn;
import br.com.jk.financeiro.contaBanco.*;
import br.com.jk.financeiro.movimentotipo.MovimentoTipo;
import br.com.jk.financeiro.movimentotipo.MovimentoTipoRn;
import br.com.jk.fornecedor.Fornecedor;
import br.com.jk.fornecedor.FornecedorRn;
import br.com.jk.util.pesquisa.Pesquisa;
import br.com.jk.util.pesquisa.Pesquisa.Tipo;
import br.com.jk.util.pesquisa.PesquisaJDialog;
import java.util.ArrayList;
import java.util.List;
import net.sf.jasperreports.engine.JRException;

/**
 *
 * @author camilo
 */
public class MovimentoController {

  private Movimento banco;
  private int colunaSel;
  private int idEmpresa;
  public boolean modoConsulta;
  private Pesquisa pesquisa = new Pesquisa();

  public MovimentoController() {
    this.banco = new Movimento();
  }

  /**
   * Verifica se todos os campos estão preenchidos, com excessão do campo jtfId
   *
   * @return
   */
  public boolean isNotNull() {
    
    return true;
  }

  public void salvar(Movimento produto) {
    if (produto != null) {
      MovimentoRn produtoRn = new MovimentoRn();
      //faz a conexão com o bd e salva os registros
      produtoRn.salvar(produto);
    }
  }

  public List<Movimento> listar() {
    MovimentoRn prn = new MovimentoRn();
    return prn.listar();
  }
  
  public List<Movimento> listar(ContaBanco conta){
    MovimentoRn prn = new MovimentoRn();
    return prn.listarPorConta(conta);
  }

  public void excluir(Movimento banco) {
    MovimentoRn fornRn = new MovimentoRn();
    fornRn.excluir(banco);
  }

  /**
   * Habilita a pesquisa somente para os campos configurados nesse método
   *
   * @param coluna Índice da coluna da qual se deseja efetuar a pesquisa
   * @return Se o campo estiver habilitado permite a pesquisa. O default é: false;
   */
  public boolean setEnabledPesquisa(int coluna) {
    colunaSel = coluna;
    switch (coluna) {
      case MovimentoTableModel.COLUNA_COD_DATA_PREVISAO:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      case MovimentoTableModel.COLUNA_COD_NUM_CHEQUE:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      case MovimentoTableModel.COLUNA_COD_DATA_LANCAMENTO:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      case MovimentoTableModel.COLUNA_COD_VALOR:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      case MovimentoTableModel.COLUNA_COD_DATA_REALIZADO:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      default:
        return false;
    }
  }

  public Pesquisa getCriterio(Tipo tipo) {
    return PesquisaJDialog.getCriterio(pesquisa.getTipo());
  }

  public List<Movimento> pesquisar() {
    List<Movimento> lstPesquisa = new ArrayList<>();
    Pesquisa pesq;
    if (modoConsulta) { //Se estiver habilitada a pesquisa executa o cod abaixo
      MovimentoRn ctrn = new MovimentoRn();

      //        Verifica qual é o tipo de campo e executa a consulta específica
      switch (colunaSel) {
        case MovimentoTableModel.COLUNA_COD_DATA_PREVISAO:
          pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
          if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
            lstPesquisa = ctrn.pesquisaPadrao(Movimento.ATTRIBUTE_DATA_LANCAMENTO, pesq.getCriterio(), pesq.getOpcao());
          }
          break;
        case MovimentoTableModel.COLUNA_COD_NUM_CHEQUE:
          pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
          if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
            lstPesquisa = ctrn.pesquisaPadrao(Movimento.ATTRIBUTE_NUMERO_CHEQUE, pesq.getCriterio(), pesq.getOpcao());
          }
          break;
        case MovimentoTableModel.COLUNA_COD_DATA_LANCAMENTO:
          pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
          if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
            lstPesquisa = ctrn.pesquisaPadrao(Movimento.ATTRIBUTE_VALOR, pesq.getCriterio(), pesq.getOpcao());
          }
          break;
        case MovimentoTableModel.COLUNA_COD_VALOR:
          pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
          if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
            lstPesquisa = ctrn.pesquisaPadrao(Movimento.ATTRIBUTE_DATA_PREVISAO, pesq.getCriterio(), pesq.getOpcao());
          }
          break;
        case MovimentoTableModel.COLUNA_COD_DATA_REALIZADO:
          pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
          if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
            lstPesquisa = ctrn.pesquisaPadrao(Movimento.ATTRIBUTE_STATUS, pesq.getCriterio(), pesq.getOpcao());
          }
          break;
      }
    }
    return lstPesquisa;
  }

  public void report() throws JRException, Exception {
    MovimentoReport mReport = new MovimentoReport();
    mReport.geraRelatorio();
//    Master.setTextJlStatus("");
//    Master.setJpbStatusIndeterminate(false);
  }

  public Movimento getProduto() {
    return banco;
  }

  public void setProduto(Movimento produto) {
    this.banco = produto;
  }

  public boolean isModoConsulta() {
    return modoConsulta;
  }

  public void setModoConsulta(boolean modoConsulta) {
    this.modoConsulta = modoConsulta;
  }

  public Fornecedor carregaFornecedor(Integer id){
    FornecedorRn fornecedorRn = new FornecedorRn();
    return fornecedorRn.carregar(id);
  }

  public Cliente carregaCliente(Integer id) {
    ClienteRn clienteRn = new ClienteRn();
    return clienteRn.carregar(id);
  }

  public ContaBanco carregaContaBanco(Integer id) {
    ContaBancoRn contaRn = new ContaBancoRn();
    return contaRn.carregar(id);
  }

  public MovimentoTipo carregaTipo(Integer id) {
    MovimentoTipoRn movTipoRn = new MovimentoTipoRn();
    return movTipoRn.carregar(id);
  }
}